package com.study.others;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.junit.Test;

/**
* @Name: PropertiesDemo
* @Description: 属性集合类测试
* 说明：
* 	Properties：属性集合类，是一个可以与IO流相结合的集合类。可保存到流中，或从流中加载。
* 继承关系：
* 	|-HashTable
* 		|-Properties：是一个Map集合，属性列表中每个键及其对应值都是一个字符串。
* 构造方法：
* 	Properties() 创建一个无默认值的空属性列表。
* 	Properties(Properties defaults)  创建一个带有指定默认值的空属性列表。
* 属性操作方法：
* 	public Object setProperty(String key, String value) 添加属性元素
* 	public String getProperty(String key) 获取属性元素
* 	public Set<String> stringPropertyNames()	返回此属性列表中的键集
* 与IO流结合使用方法：
* 	public void load(InputStream inStream) 把文件中的数据(格式必须是键=值对的形式)读入到Properties集合中
* 	public void load(Reader reader) 把文件中的数据(格式必须是键=值对的形式)读入到Properties集合中
* 	public void store(OutputStream out, String comments) 把Properties集合中的数据存储到指定的文件中 (以键=值对的形式存储)
											   comments - 属性列表的描述。 
	public void store(Writer writer, String comments) 把Properties集合中的数据存储到指定的文件中(以键=值对的形式存储)
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-17 下午2:23:26 
* @Version: V1.0
 */
public class PropertiesDemo {
	
	/**
	* @Name: test01
	* @Description: Properties基本Map集合操作（不建议这样使用）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-17 下午2:26:05
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void test01() {
		//创建Properties对象
		Properties prop = new Properties() ;
		//添加元素
		prop.put("001", "hello") ;
		prop.put("002", "world") ;
		prop.put("003", "java") ;
		//遍历集合1：遍历每一个Properties元素
		for (Map.Entry entry : prop.entrySet()) {
			System.out.println(entry.getKey() + ":" + entry.getValue());
		}
		//遍历集合2：先遍历Properties集合的Key，根据Key获取对应的Value。
		Set<Object> key = prop.keySet() ;
		for (Object obj : key) {
			System.out.println(obj + ":" + prop.get(obj));
		}
	}
	
	/**
	* @Name: test02
	* @Description: Properties属性集合元素操作（建议使用其提供的setProperty和getProperty方法，限制指定操作字符串）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-17 下午2:44:35
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void test02() {
		//创建Properties集合
		Properties prop = new Properties() ;
		//添加元素
		prop.setProperty("001", "hello") ;
		prop.setProperty("002", "world") ;
		prop.setProperty("003", "java") ;
		//获取元素
		//获取Properties对象的键集
		Set<String> ketSet = prop.stringPropertyNames() ;
		//遍历获取每一个属性元素
		for (String key : ketSet) {
			System.out.println(key + ":" + prop.getProperty(key));
		}
	}
	
	/**
	* @Name: store
	* @Description: Properties和IO流结合使用01：将Properties属性集合中的元素数据存储到文件中
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-17 下午2:50:17
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void store() throws IOException {
		//创建Properties集合
		Properties prop = new Properties() ;
		//添加元素
		prop.setProperty("001", "hello") ;
		prop.setProperty("002", "world") ;
		prop.setProperty("003", "java") ;
		//创建文件写入字符流
		Writer writer = new FileWriter("name.txt") ;
		//将Properties集合中的元素存储到指定文件中
		prop.store(writer, "备注信息：helloworld") ;
		//释放资源
		writer.close() ;
	}
	
	/**
	* @Name: load
	* @Description: Properties和IO流结合使用02：将文件中的key=value数据加载到Properties属性集合
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-17 下午2:50:17
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void load() throws IOException {
		//创建文件读取字符流
		Reader reader = new FileReader("name.txt") ;
		//创建Properties对象
		Properties prop = new Properties() ;
		//将文件中的key=value值加载到Properties集合中
		prop.load(reader) ;
		Set<String> keyList = prop.stringPropertyNames() ;
		for (String key : keyList) {
			System.out.println(key + ":" + prop.getProperty(key));
		}
		//释放资源
		reader.close() ;
	}
	
	/**
	* @Name: example
	* @Description: Properties使用练习
	* 描述：
	* 	存在一个文本文件user.txt，里边的数据以key=value对的形式存储
	* 	判断是否存在"lisi"的键，如果存在，修改对应的值为"100"。
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-17 下午3:14:16
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void example() throws IOException {
		//创建文件字符读取流对象
		Reader reader = new FileReader("user.txt") ;
		//创建Properties属性集合对象
		Properties prop = new Properties() ;
		//将文件中的数据加载到Properties对象中
		prop.load(reader) ;
		reader.close() ;
		//遍历Properties对象元素
		Set<String> keyList = prop.stringPropertyNames() ;
		if(keyList != null && keyList.size() > 0) {
			for (String key : keyList) {
				//如果存在key="lisi"的键，修改其value=100
				if("lisi".equals(key)) {
					prop.setProperty(key, "100") ;
					break ;
				}
			}
		}
		//创建文件字符流写入对象
		Writer writer = new FileWriter("user.txt") ;
		//将修改后的Properties集合存入文件
		prop.store(writer, "user") ;
		//释放资源
		writer.close() ;
	}
	

}

















